﻿using Unity.UIWidgets.ui;
using Unity.UIWidgets.gestures;
using UnityEngine;

namespace Unity.UIWidgets.rendering {

{% macro RenderProxyBoxMixin(with) %}
    public abstract class RenderProxyBoxMixin{{with}}<T> : {{with}}<T> where T : RenderBox {
        public override void setupParentData(RenderObject child) {
            if (!(child.parentData is ParentData)) {
                child.parentData = new ParentData();
            }
        }


        protected internal override float computeMinIntrinsicWidth(float height) {
            if (this.child != null) {
                return this.child.getMinIntrinsicWidth(height);
            }
            return 0.0f;
        }


        protected internal override float computeMaxIntrinsicWidth(float height) {
            if (this.child != null) {
                return this.child.getMaxIntrinsicWidth(height);

            }

            return 0.0f;
        }

        protected internal override float computeMinIntrinsicHeight(float width) {
            if (this.child != null) {
                return this.child.getMinIntrinsicHeight(width);

            }

            return 0.0f;
        }


        protected internal override float computeMaxIntrinsicHeight(float width) {
            if (this.child != null) {
                return this.child.getMaxIntrinsicHeight(width);

            }
            return 0.0f;
        }

        protected override float? computeDistanceToActualBaseline(TextBaseline baseline) {
            if (child != null) {
                return child.getDistanceToActualBaseline(baseline);
            }

            return base.computeDistanceToActualBaseline(baseline);
        }

        protected override void performLayout() {
            if (child != null) {
                child.layout(constraints, parentUsesSize: true);
                size = child.size;
            } else {
                performResize();
            }
        }

        protected override bool hitTestChildren(BoxHitTestResult result, Offset position = null) {
            if (child != null) {
                return child.hitTest(result, position);

            }

            return false;
        }

        public override void applyPaintTransform(RenderObject child, Matrix4 transform) {
        }

        public override void paint(PaintingContext context, Offset offset) {
            if (child != null) {
                context.paintChild(child, offset);
            }
        }
    }
{% endmacro %}


{{ RenderProxyBoxMixin('RenderObjectWithChildMixinRenderBox') }}

    public abstract class RenderProxyBoxMixinRenderObjectWithChildMixinRenderBoxRenderStack: 
        RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox<RenderStack> {
    }

}
